package com.cty.sixteenthDay;

/*
 * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
 * 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
 *
 * */
public class Q_20 {
    public static void main(String[] args) {


    }

    // 力扣官方题解 方法一:原地计算
    /*
     * 思路:先从外圈 交换 几个值 四个值的交换 只需遍历的 n - 2 这个索引处(包括n - 2)
     * 然后往内层循环 循环到 n / 2即可
     * 时间复杂度O(n ^ 2) 空间复杂度O(1)
     * */
    public static void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n / 2; i++) {
            // 这里从零开始的目的 是让其把矩阵的另一半 也给换了
            for (int j = 0; j < (n + 1) / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - j][i];
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                matrix[j][n - 1 - i] = temp;
            }
        }
    }

    //方法二:翻转代替旋转（力扣官方题解）
    public static void rotate2(int[][] matrix) {
        int n = matrix.length;
        // 水平反转
        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < n; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - i][j];
                matrix[n - 1 - i][j] = temp;
            }
        }

        // 对角线反转
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i] ;
                matrix[j][i] = temp;
            }
        }
    }
}
